﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace ERModelData
{
    public partial class DiagrammEditor : UserControl
    {
        /// Информацтя о объектах визуализации
        Diagramm diagramm;
        /////////////////Режим рисования линии////////////
        /// <summary>Процесс рисования линии</summary>
        bool PaintLink;
        /// <summary>Начальная точка линии</summary>
        MarkerLink beginLinePoint = null;
        /// <summary>Конечная точка линии</summary>
        Point endLinePoint;
        ////////////////Обычный режим////////////////////
        /// Маркер выделенной сущности
        MarkersTransformEssence MarkerEssenceSelect = null;
        /// Выделенная сущность
        EssenceVisuality EssenceVisualitySelect = null;
        /// <summary>Объект процесса трансформации сущности</summary>
        TransformEssenceVisuality Transform = new TransformEssenceVisuality();
        /// <summary>Рабочая поверхность редактора</summary>
        /// <param name="dmm">Объект соержащий всю информацию о объектах визуализации</param>
        public DiagrammEditor(Diagramm dmm)
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            diagramm = dmm;
        }
        /// <summary>Начало процесса рисования линии</summary>
        public void StartPaintLink()
        {
            PaintLink = true;
            this.Cursor = Cursors.Cross;
            beginLinePoint = null;
            EssenceVisualitySelect = null;
            MarkerEssenceSelect = null;
        }
        /// <summary>Конец процесса рисования линии</summary>
        public void EndPaintLink()
        {
            PaintLink = false;
            this.Cursor = Cursors.Arrow;
        }
        /// <summary>Перерисовка окна</summary>
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            this.Invalidate();
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            /// Рисуем все связи
            foreach (Link f in diagramm.links)
                f.Draw(g);
            /// Рисуем все сущности
            foreach (Essence f in diagramm.essences)
                f.visuality.Draw(g, f);
            /// Если включен режим рисования линий
            if (PaintLink)
            {
                foreach (Essence i in diagramm.essences) i.visuality.markersLinks.Draw(g);
                if (beginLinePoint != null) g.DrawLine(Config.cLink.penCreate, beginLinePoint.point, endLinePoint);
            }
            /// Eсли есть трансформация сущности, рисуем контур трансформации
            if (Transform.IsProcces()) g.DrawRectangle(new Pen(Color.Black), Transform.GetObjectVisuality());
            /// Если выделена какая-то сущность, рисуем маркеры сущности
            if (MarkerEssenceSelect != null) MarkerEssenceSelect.Draw(g);
        }
        /// <summary>Движение мыши</summary>
        protected override void OnMouseMove(MouseEventArgs e)
        {
            /// Включен режим рисования линий
            if (PaintLink)
            {
                foreach (Essence i in diagramm.essences) 
                    i.visuality.markersLinks.Check(e.Location); 
                endLinePoint = e.Location; 
                return;
            }
            /// Если есть трансформация сущности, продолжаем трансформацию
            if (e.Button == MouseButtons.Left & Transform.IsProcces())
            {
                Transform.Transform(e.Location);
                this.Invalidate();
                return;
            }
            /// Если выделена какая - то сущность
            if (EssenceVisualitySelect != null)
            {
                if (MarkerEssenceSelect.Check(e.Location)) this.Cursor = MarkerEssenceSelect.cursor;
                else this.Cursor = Cursors.Arrow;
            }    
        }
        /// <summary>Нажатие на клавишу мыши</summary>
        protected override void OnMouseDown(MouseEventArgs e)
        {
            /// Включен режим рисования линий
            if (PaintLink)
            {
                if (e.Button == System.Windows.Forms.MouseButtons.Left)
                    foreach (Essence i in diagramm.essences)
                    {
                        MarkerLink select = i.visuality.markersLinks.Check(e.Location);
                        if (select != null) beginLinePoint = select;
                    }
                else if (e.Button == System.Windows.Forms.MouseButtons.Right) EndPaintLink();
                return;
            }
            //Сначало необходимо проверить на попадение в маркеры
            if (MarkerEssenceSelect != null && MarkerEssenceSelect.Check(e.Location)) 
            { 
                Transform.StartScale(e.Location, EssenceVisualitySelect.essenceObject, MarkerEssenceSelect); 
                return; 
            }
            EssenceVisuality Select = diagramm.CheckEssences(e.Location);
            if (EssenceVisualitySelect == Select) { if (Select != null)Transform.StartMove(e.Location, EssenceVisualitySelect.essenceObject); return; }
            else
            {
                EssenceVisualitySelect = Select;
                if (EssenceVisualitySelect != null) MarkerEssenceSelect = new MarkersTransformEssence(EssenceVisualitySelect);
                else { MarkerEssenceSelect = null; Cursor = Cursors.Arrow; }
                this.Invalidate();
            }
        }
        /// <summary>Отпускание клавиши мыши</summary>
        protected override void OnMouseUp(MouseEventArgs e)
        {
            if (PaintLink)
            {
                foreach (Essence i in diagramm.essences)
                {
                    MarkerLink select = i.visuality.markersLinks.Check(e.Location);
                    if (select != null)
                    {
                        Link l = new Link("");
                        beginLinePoint.arrayLinks.Add(l);
                        select.arrayLinks.Add(l);
                        l.BeginPoint.marker = beginLinePoint;
                        l.EndPoint.marker = select;
                        diagramm.links.Add(l);
                        EndPaintLink();
                    }
                    else EndPaintLink();
                }
            }
            if (Transform.IsProcces())
            {
                EssenceVisualitySelect.essenceObject = Transform.EndTransform();
                MarkerEssenceSelect.Refresh(MarkerEssenceSelect.GetPoints(EssenceVisualitySelect.essenceObject));
                EssenceVisualitySelect.markersLinks.Refresh(EssenceVisualitySelect.markersLinks.GetPoints(EssenceVisualitySelect.essenceObject));
                this.Invalidate();
            }
        }
    }
}